package br.com.afi.util.hibernate.validator;

import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

/**
 * Classe utilitária que facilita a validação programática do Hibernate Validator.
 * 
 * @author André de Fontana Ignacio
 * @version 1.0
 * @param <T> Tipo da Classe a ser Validada
 */
public class HibernateValidatorUtil<T>
{
	private static final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();

	/**
	 * Construtor
	 */
	public HibernateValidatorUtil()
	{
		super();
	}

	/**
	 * Verifica se o objeto é válido e caso um ou mais atributos sejam inválidos. Constrói uma lista
	 * de mensagens.
	 * 
	 * @param obj Objeto a ser validado
	 * @return Resultado da validação
	 */
	public ValidationResult<T> validate( T obj )
	{
		final Validator validator = factory.getValidator();
		final Set<ConstraintViolation<T>> violations = validator.validate( obj );
		return new ValidationResult<T>( violations );
	}
	
	public ValidationResult<T> validate( T obj, Class<?>[] groups )
	{
		final Validator validator = factory.getValidator();
		final Set<ConstraintViolation<T>> violations = validator.validate( obj, groups );
		return new ValidationResult<T>( violations );
	}
}
